﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace KioskosJugandoLimpio.Classes
{
    public class Pregunta
    {
        public int idPreguntas;
        public string pregunta;
        public int numero;
        public Seccion seccion;
        public List<Opcion> Opciones;
        public string ControlDefault;
        public RadioButtonList radios;
        public CheckBoxList checks;
        public int tipoPregunta;

        public int idPreguntaOculta;
        public string idOpcionActiva;
        public bool visible;


        public Pregunta(int idPreguntas, string pregunta, int numero, string ControlDefault, int tipoPregunta, int idPreguntaOculta, string idOpcionActiva, bool visible, Seccion seccion)
        {
            // TODO: Complete member initialization
            this.tipoPregunta = tipoPregunta;
            this.idPreguntas = idPreguntas;
            this.pregunta = pregunta;
            this.numero = numero;

            this.idPreguntaOculta = idPreguntaOculta;
            this.idOpcionActiva = idOpcionActiva;
            this.visible = visible;

            this.ControlDefault = ControlDefault;
            this.seccion = seccion;
            DataTable t = SQL.fnDataTable(string.Format("EXEC opcionesPorPregunta {0}", idPreguntas));
            Opciones = new List<Opcion>();
            foreach (DataRow row in t.Rows)
            {
                Opciones.Add(new Opcion(int.Parse(row["idOpciones"].ToString()), row["Opcion"].ToString(), row["Valor"].ToString(), this, bool.Parse(row["Marcado"].ToString())));
            }
            radios = new RadioButtonList();
            radios.ClientIDMode = ClientIDMode.Static;
            radios.ID = this.idPreguntas.ToString();
            radios.RepeatDirection = RepeatDirection.Horizontal;
            checks = new CheckBoxList();
            checks.ClientIDMode = ClientIDMode.Static;
            checks.ID = this.idPreguntas.ToString();
            checks.RepeatDirection = RepeatDirection.Horizontal;
        }

        public Pregunta(int idPreguntas, string pregunta, int numero, string ControlDefault, int tipoPregunta, int idPreguntaOculta, string idOpcionActiva, bool visible, Seccion seccion, char x)
        {
            // TODO: Complete member initialization
            this.tipoPregunta = tipoPregunta;
            this.idPreguntas = idPreguntas;
            this.pregunta = pregunta;
            this.numero = numero;

            this.idPreguntaOculta = idPreguntaOculta;
            this.idOpcionActiva = idOpcionActiva;
            this.visible = visible;

            this.ControlDefault = ControlDefault;
            this.seccion = seccion;
            DataTable t = SQL.fnDataTable(string.Format("EXEC opcionesPorPregunta {0}", idPreguntas));
            Opciones = new List<Opcion>();

            radios = new RadioButtonList();
            radios.ClientIDMode = ClientIDMode.Static;
            radios.ID = this.idPreguntas.ToString();
            radios.RepeatDirection = RepeatDirection.Horizontal;
            checks = new CheckBoxList();
            checks.ClientIDMode = ClientIDMode.Static;
            checks.ID = this.idPreguntas.ToString();
            checks.RepeatDirection = RepeatDirection.Horizontal;
        }

        public Pregunta(int idPreguntas)
        {
            // TODO: Complete member initialization
            this.idPreguntas = idPreguntas;
            this.ControlDefault = "text";
            this.tipoPregunta = -1;
            Opciones = new List<Opcion>();
        }


        public Control control
        {
            get
            {

                if (this.seccion.Encuesta.mode == Modes.Edit)
                {
                    return controlEdit;
                }

                Label ctl = new Label();

                ctl.Controls.Add(lblPregunta);
                switch (ControlDefault)
                {
                    case "checkbox":
                        foreach (Opcion opcion in Opciones)
                        {
                            checks.Items.Add(opcion.listItem);
                        }
                        ctl.Controls.Add(checks);
                        break;
                    case "radio":
                        foreach (Opcion opcion in Opciones)
                        {
                            ListItem litem = opcion.listItem;
                            if (opcion.pregunta.idPreguntaOculta > 0)
                            {
                                if (opcion.idOpciones == int.Parse(opcion.pregunta.idOpcionActiva))
                                {
                                    litem.Attributes.Add("onclick", string.Format("visiblePregunta({0}, 1);", opcion.pregunta.idPreguntaOculta));
                                }
                                else
                                {
                                    litem.Attributes.Add("onclick", string.Format("visiblePregunta({0}, 0);", opcion.pregunta.idPreguntaOculta));
                                }
                            }

                            litem.Attributes.Add("class", "hrRadio");

                            radios.Items.Add(litem);
                        }
                        ctl.Controls.Add(radios);
                        break;
                    case "select":
                        DropDownList drop = new DropDownList();
                        drop.ID = idPreguntas.ToString();
                        drop.ClientIDMode = ClientIDMode.Static;
                        foreach (Opcion opcion in Opciones)
                        {
                            drop.Items.Add(opcion.listItem);
                        }
                        ctl.Controls.Add(drop);
                        break;
                    default:
                        foreach (Opcion opcion in Opciones)
                        {
                            ctl.Controls.Add(opcion.control);
                        }
                        break;
                }
                ctl.CssClass = "pregunta";
                ctl.Attributes.Add("id", this.idPreguntas.ToString());
                ctl.Attributes.Add("validar", this.ControlDefault);
                if (ControlDefault == "text")
                {
                    TextBox txbBox = new TextBox() { ID = this.idPreguntas.ToString(), ClientIDMode = ClientIDMode.Static };
                    //if (int.Parse(this.visible) == 0)
                    //{
                    //    txbBox.Text = "NO";
                    //}
                    ctl.Controls.Add(txbBox);
                }
                if (ControlDefault == "rango")
                {
                    TextBox t = new TextBox() { ID = this.idPreguntas.ToString(), ClientIDMode = ClientIDMode.Static };
                    t.CssClass = "num";
                    ctl.Controls.Add(t);
                }

                if (this.visible)
                {
                    ctl.Style.Add("display", "none");
                }

                return ctl;
            }
        }

        public Control lblPregunta
        {
            get
            {
                Label l = new Label();
                l.Text = pregunta;
                l.CssClass = "pregunta";
                return l;
            }
        }

        public Control controlEdit
        {
            get
            {
                DIVformat divMain = new DIVformat("__pregunta_" + idPreguntas);
                DIVformat divHead = new DIVformat("__pregunta_head_" + idPreguntas);

                divHead.addLink("Eliminar Pregunta...", string.Format("fnDelPregunta('{0}')", idPreguntas));
                divHead.addNewLine();
                divHead.addLabel("Pregunta", "pregunta");
                divHead.addNewLine();
                divHead.addTextArea(pregunta.ToString(), "PR", "txaPregunta" + idPreguntas, "pregunta", "width: 100%; height: 60px;");
                divHead.addLabel("esta pregunta depende de la de arriba ?", "width: 60%; text-align: center;");
                divHead.addCheckBox("PM",this.visible);
                divHead.addNewLine();

                DropDownList cmbTiposPreguntas = new DropDownList();
                cmbTiposPreguntas.Attributes.Add("hrName", "PT");
                string pid = idPreguntas > 0 ? idPreguntas.ToString() : Guid.NewGuid().ToString("N");
                cmbTiposPreguntas.ID = "__cmbOption";
                //cmbTiposPreguntas.Attributes.Add("onchange",string.Format("fnOptions('{0}')",pid));

                DataTable dt = SQL.fnDataTable("EXEC obtenerTiposPreguntas");
                foreach (DataRow row in dt.Rows)
                {
                    ListItem tp = new ListItem(row["TipoPregunta"].ToString(), row["idTiposPreguntas"].ToString());
                    if (int.Parse(row["idTiposPreguntas"].ToString()) == this.tipoPregunta || (tipoPregunta == -1 && row["ControlDefault"].ToString() == "text"))
                    {
                        tp.Selected = true;
                    }
                    cmbTiposPreguntas.Items.Add(tp);
                }

                divHead.addLabel("Tipo de pregunta", "pregunta");
                divHead.addControl(cmbTiposPreguntas);
                divHead.addNewLine();

                if (this.ControlDefault != "text")
                {
                    divHead.addLabel("Opciones", "pregunta");
                    divHead.addNewLine();
                    foreach (Opcion opcion in Opciones)
                    {
                        divHead.addControl(opcion.input);
                    }
                    divMain.addControl(divHead.getDIV());
                    divMain.addLink("Agregar Opcion ...", string.Format("addOption('__pregunta_head_{0}');", idPreguntas));
                }
                else
                {
                    divHead.addLabel("Este tipo de pregunta no necesita opciones.", "");
                    divMain.addControl(divHead.getDIV());
                }
                divMain.addNewLine();
                return divMain.getDIV();
            }
        }

        public Control inputPregunta
        {
            get
            {
                TextBox l = new TextBox();
                l.Text = pregunta;
                l.ClientIDMode = ClientIDMode.Static;
                l.ID = "__textoPregunta_";
                l.CssClass = "pregunta";
                l.Attributes.Add("style", "width:100%;");
                return l;
            }
        }


        internal void guardar(System.Data.SqlClient.SqlTransaction tran, ref int idPreguntasAnt)
        {
             //Actualiza los anteriores
            if (idPreguntasAnt != 0 && idPreguntasAnt > 0 && this.visible)
            {
                SQL.fnExec(string.Format("EXEC CambiarIdPreguntaAnt {0},{1}", this.idPreguntas, idPreguntasAnt), tran);
            }

            if (this.idPreguntas == -1)
            {
                this.idPreguntas = SQL.fnExec(string.Format("EXEC guardarPregunta {0},{1},{2},{3}, {4}, '{5}', {6},{7},{8}", this.idPreguntas, this.seccion.Encuesta.idEncuestas, 0, 0, 0, this.pregunta, this.seccion.idSecciones, this.tipoPregunta, this.visible), tran);
            }
            else
            {
                SQL.fnExec(string.Format("EXEC guardarPregunta {0},{1},{2},{3}, {4}, '{5}', {6},{7},{8}", this.idPreguntas, this.seccion.Encuesta.idEncuestas, 0, 0, 0, this.pregunta, this.seccion.idSecciones, this.tipoPregunta, this.visible), tran);
            }

            DataTable t = SQL.fnDataTable(string.Format("EXEC opcionesPorPregunta {0}", idPreguntas));
            foreach (DataRow row in t.Rows)
            {
                bool deleted = true;
                foreach (Opcion opcion in Opciones)
                {
                    if (opcion.idOpciones.ToString().Equals(row["idOpciones"].ToString()))
                    {
                        deleted = false;
                    }
                }
                if (deleted)
                {
                    SQL.fnExec(string.Format("EXEC borrarOpcionesPreguntas {0},{1}", row["idOpciones"].ToString(), this.idPreguntas), tran);
                }
            }

            foreach (Opcion opcion in this.Opciones)
            {
                opcion.guardar(tran);
            }
            idPreguntasAnt = this.idPreguntas;
        }
    }
}
